package com.yinzifan.manager.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import com.yinzifan.entity.Product;
import com.yinzifan.entity.enums.ProductStatus;
import com.yinzifan.manager.error.ErrorEnum;
import com.yinzifan.manager.repository.ProductRepository;

@Service
public class ProductService {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(ProductService.class);
	@Autowired
	private ProductRepository productRepository;
	public Product addProduct(Product product) {
		// 数据校验
		checkProduct(product);
		setDefault(product);
		Product result = productRepository.save(product);
		LOGGER.debug("创建产品, 结果: {}", result);
		return result;
	}
	/**
	 * 查询单个产品
	 * @param id
	 * @return
	 */
	public Product findOne(String id) {
		Assert.notNull(id, "需要产品编号参数");
		Product result = productRepository.findById(id).get();
		LOGGER.debug("创建产品, 结果: {}", result);
		return result;
	}
	
	public Page<Product> query(List<String> idList, BigDecimal minRewardRate, BigDecimal maxRewardRate, List<String> statusList, Pageable pageable) {
		LOGGER.debug("查询产品,idList={},minRewardRate={},maxRewardRate={},statusList={},pageable={}", idList, minRewardRate, maxRewardRate, statusList, pageable);
		Specification<Product> specification = (root, query ,cb) -> {
			Path<String> idCol = root.get("id");
			Path<BigDecimal> rewardRateCol = root.get("rewardRate");
			Path<String> statusCol = root.get("status");
			List<Predicate> predicates = new ArrayList<>();
			if(idList != null && idList.size() > 0) {
				predicates.add(idCol.in(idList));
			}
			if(minRewardRate != null && BigDecimal.ZERO.compareTo(minRewardRate) < 0) {
				predicates.add(cb.ge(rewardRateCol, minRewardRate));
			}
			if(maxRewardRate != null && BigDecimal.ZERO.compareTo(maxRewardRate) < 0) {
				predicates.add(cb.le(rewardRateCol, maxRewardRate));
			}
			if(statusList != null && statusList.size() > 0) {
				predicates.add(statusCol.in(statusList));
			}
			query.where(predicates.toArray(new Predicate[0]));
			return null;
		};
		Page<Product> result = productRepository.findAll(specification, pageable);
		LOGGER.debug("查询产品,结果={}", result);
		return result;
	}
	
	   /**
     * 设置默认值
     * 创建时间、更新时间
     * 投资步长、锁定期、状态
     *
     * @param product
     */
    private void setDefault(Product product) {
        if (product.getCreateAt() == null) {
            product.setCreateAt(new Date());
        }
        if (product.getUpdateAt() == null) {
            product.setUpdateAt(new Date());
        }
        if (product.getStepAmount() == null) {
            product.setStepAmount(BigDecimal.ZERO);
        }
        if (product.getLockTerm() == null) {
            product.setLockTerm(0);
        }
        if (product.getStatus() == null) {
            product.setStatus(ProductStatus.AUDITING.name());
        }
    }
	/**
	 * 进行数据校验
	 * 1. 非空数据
	 * 2. 收益率要0~30以内
	 * 3. 投资歩长需要为整数
	 * @param product
	 */
	private void checkProduct(Product product) {
        Assert.notNull(product.getId(), ErrorEnum.ID_NOT_NULL.getCode());
        //其他非空校验 

        Assert.isTrue(BigDecimal.ZERO.compareTo(product.getRewardRate()) < 0 && BigDecimal.valueOf(30).compareTo(product.getRewardRate()) >= 0, "收益率范围错误");

        Assert.isTrue(BigDecimal.valueOf(product.getStepAmount().longValue()).compareTo(product.getStepAmount()) == 0, "投资步长需为整数");

		
		
	}
	
}
